home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2001 September / PC-WELT 9-2001.ISO / software / hw / brennen / flask_src.exe / options.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-26  |  46.6 KB  |  1,460 lines

  1. /* 
  2.  *  options.cpp    -  Controls FlasKMPEG options
  3.  *
  4.  *    Copyright (C) Alberto Vigata - January 2000
  5.  *
  6.  *  This file is part of FlasKMPEG, a free MPEG to MPEG/AVI converter
  7.  *    
  8.  *  FlasKMPEG is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2, or (at your option)
  11.  *  any later version.
  12.  *   
  13.  *  FlasKMPEG is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *   
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with GNU Make; see the file COPYING.  If not, write to
  20.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  21.  *
  22.  */
  23.  
  24.  
  25. #include "flaskmpeg.h"
  26. #include "resource.h"
  27. #include "auxiliary.h"
  28. #include <commctrl.h>
  29. #include "error.h"
  30. #include ".\Resizer\filter.h"
  31. #include ".\Resizer\resizer.h"
  32. #include ".\postprocessing.h"
  33. #include ".\Video\Videowrapper.h"
  34. #include ".\runstate.h"
  35. #include ".\YUVtoRGB.h"
  36.  
  37. extern TConfig          o;
  38. extern TRunState        rs;
  39. extern HINSTANCE        hInst;
  40.  
  41. struct TOptions{
  42.     int         frames_compile;
  43. };
  44.  
  45. #define GET_FRAMERATE(x) ((double)x.scale/(double)x.sampleSize)
  46.  
  47. struct Trunoptions{
  48.     // Temporal data
  49.     ui8*      DisplayImage;
  50.     ui8*      DecodedImage;
  51.     VBitmap   in, out;
  52.     TPPost              pp;
  53.     TOptions            opt;
  54. } opt_run;
  55.  
  56. HFONT myFont;
  57.  
  58.  
  59. #define C_PAGES 5
  60. typedef struct tag_dlghdr { 
  61.    HWND hwndTab;       // tab control 
  62.    HWND hwndDisplay;   // current child dialog box 
  63.    RECT rcDisplay;     // display rectangle for the tab control 
  64.    HWND DlgTabs[C_PAGES];
  65.    /* these function pointers check for valid data in the given
  66.     * tab (corresponding to DlgTabs); on valid data, true is returned;
  67.     * on invalid data, an error is displayed, focus set on the
  68.     * proper control and false is returned. 
  69.     *
  70.     * If this is NULL, then there are no checks and a true return
  71.     * is assumed.
  72.     */
  73.    bool (*DlgTabCheck[C_PAGES])(HWND hDlg);
  74. } DLGHDR; 
  75. HWND video,audio,processing,files,general;
  76. DLGHDR    *pHdr;
  77.  
  78.  
  79. ////////////////////////////////////////////////////////
  80. //             OUTPUT    PAD
  81. ////////////////////////////////////////////////////////
  82. LRESULT CALLBACK DisplayProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
  83.  
  84. HGDIOBJ     originalObject;
  85. HFONT       myFont;
  86. BITMAPINFO  dibInfo;
  87. HDC         hDC;
  88. char        szTemp[256];
  89.     switch (message)
  90.     {
  91.         case WM_INITDIALOG:
  92.                 return TRUE;
  93.         case WM_PAINT:
  94.  
  95.             //BeginPaint(hWnd, &lp);
  96.             ZeroMemory(&dibInfo, sizeof(BITMAPINFO));
  97.             opt_run.out.MakeBitmapHeader(&dibInfo.bmiHeader);
  98.             hDC=GetDC(hWnd);
  99.             SetDIBitsToDevice(hDC ,0,0,opt_run.out.w,opt_run.out.h,
  100.                      0,0,0,opt_run.out.h, (ui8 *)opt_run.out.Address(),&dibInfo,DIB_RGB_COLORS);
  101.             
  102.             // Paint image stats
  103.             // Create Font
  104.             myFont = (HFONT)GetStockObject(ANSI_VAR_FONT); 
  105.             if (originalObject = SelectObject(hDC, myFont)) 
  106.             { 
  107.                 sprintf(szTemp, "%d x %d", opt_run.out.w, opt_run.out.h);
  108.                 TextOut(hDC, 3, 3, szTemp, strlen(szTemp)); 
  109.  
  110.                 if(opt_run.pp.crop){
  111.                     sprintf(szTemp, "%s: %d", GS(OPT_OUTPAD_TOPOFFSET), opt_run.pp.cropTopOffset);
  112.                     TextOut(hDC, 80, 3, szTemp, strlen(szTemp)); 
  113.                     sprintf(szTemp, "%s: %d", GS(OPT_OUTPAD_LEFTOFFSET), opt_run.pp.cropLeftOffset);
  114.                     TextOut(hDC, 80, 20, szTemp, strlen(szTemp)); 
  115.  
  116.                 }
  117.  
  118.                 SelectObject(hDC, originalObject); 
  119.  
  120.             } 
  121.  
  122.  
  123.  
  124.             ReleaseDC(hWnd, hDC);
  125.  
  126.  
  127.             //EndPaint(hWnd, &lp);
  128.             break;
  129.         case WM_COMMAND:
  130.  
  131.             break;
  132.     }
  133.     return FALSE;
  134. }
  135.  
  136. // Snap second window to the first
  137. void Snap(HWND win1, HWND win2){
  138.     RECT   rc;
  139.         // Get rect win1
  140.         GetWindowRect(win1, &rc);
  141.         // Set position of second window
  142.         WindowMove(win2, rc.left, rc.bottom );
  143.  
  144.  
  145. }
  146.  
  147. // UpdateVBitmaps: update size from run state post processing options
  148. //                 and from running input video stream
  149. void UpdateVBitmaps(){
  150.     if(opt_run.pp.crop)
  151.         opt_run.out.init(opt_run.DisplayImage  , opt_run.pp.cropWidth, opt_run.pp.cropHeight    , 32);
  152.     else
  153.         opt_run.out.init(opt_run.DisplayImage  , opt_run.pp.resWidth , opt_run.pp.resHeight     , 32);
  154.     opt_run.in.init(opt_run.DecodedImage  , rs.video->pictureWidth, rs.video->picutreHeight, 32);
  155. }
  156. // UpdateDisplay changes the size of the display window and writes the new image there
  157. void UpdateDisplay(HWND hWnd){
  158.     UpdateVBitmaps();
  159.     // Resize client area
  160.     WindowClientResize(hWnd, opt_run.out.w, opt_run.out.h);
  161.     
  162.  
  163.     
  164.     // PostProcess image
  165.     PostProcessingStart(&opt_run.in , &opt_run.out, &opt_run.pp);
  166.     PostProcess        (&opt_run.in , &opt_run.out, &opt_run.pp);
  167.     PostProcessingStop (&opt_run.pp);
  168.  
  169.     // Force image update
  170.     InvalidateRect(hWnd, NULL, false);
  171.  
  172.  
  173. }
  174.  
  175. void EnableCropBoxes(HWND hDlg){
  176.     DlgEnable(hDlg, IDC_CROP_TOPOFFSET);
  177.     DlgEnable(hDlg, IDC_CROP_HEIGHT);
  178.     DlgEnable(hDlg, IDC_CROP_LEFTOFFSET);
  179.     DlgEnable(hDlg, IDC_CROP_WIDTH);
  180. }
  181.  
  182. void DisableCropBoxes(HWND hDlg){
  183.     DlgDisable(hDlg, IDC_CROP_TOPOFFSET);
  184.     DlgDisable(hDlg, IDC_CROP_HEIGHT);
  185.     DlgDisable(hDlg, IDC_CROP_LEFTOFFSET);
  186.     DlgDisable(hDlg, IDC_CROP_WIDTH);
  187. }
  188. void EnableLetterboxBoxes(HWND hDlg){
  189.                     DlgEnable(hDlg, IDC_LETTERBOX_TOP);
  190.                     DlgEnable(hDlg, IDC_LETTERBOX_BOTTOM);
  191.                     DlgEnable(hDlg, IDC_LETTERBOX_RIGHT);
  192.                     DlgEnable(hDlg, IDC_LETTERBOX_LEFT);
  193. }
  194.  
  195. void DisableLetterboxBoxes(HWND hDlg){
  196.                     DlgDisable(hDlg, IDC_LETTERBOX_TOP);
  197.                     DlgDisable(hDlg, IDC_LETTERBOX_BOTTOM);
  198.                     DlgDisable(hDlg, IDC_LETTERBOX_RIGHT);
  199.                     DlgDisable(hDlg, IDC_LETTERBOX_LEFT);
  200. }
  201. void SetCropBoxesText(HWND hDlg){
  202.                 DlgSetText(hDlg, IDC_CROP_TOPOFFSET, opt_run.pp.cropTopOffset);
  203.                 DlgSetText(hDlg, IDC_CROP_HEIGHT,    opt_run.pp.cropHeight);
  204.                 DlgSetText(hDlg, IDC_CROP_LEFTOFFSET,opt_run.pp.cropLeftOffset);
  205.                 DlgSetText(hDlg, IDC_CROP_WIDTH,     opt_run.pp.cropWidth);
  206. }
  207. void SetLetterboxBoxesText(HWND hDlg){
  208.                 DlgSetText(hDlg, IDC_LETTERBOX_TOP,       opt_run.pp.letterboxTop);
  209.                 DlgSetText(hDlg, IDC_LETTERBOX_BOTTOM,    opt_run.pp.letterboxBottom);
  210.                 DlgSetText(hDlg, IDC_LETTERBOX_RIGHT,     opt_run.pp.letterboxRight);
  211.                 DlgSetText(hDlg, IDC_LETTERBOX_LEFT,      opt_run.pp.letterboxLeft);
  212. }
  213. void GetCropBoxesText(HWND hDlg){
  214.                 opt_run.pp.cropTopOffset = DlgGetText(hDlg, IDC_CROP_TOPOFFSET);
  215.                 opt_run.pp.cropHeight    = DlgGetText(hDlg, IDC_CROP_HEIGHT);
  216.                 opt_run.pp.cropLeftOffset= DlgGetText(hDlg, IDC_CROP_LEFTOFFSET);
  217.                 opt_run.pp.cropWidth     = DlgGetText(hDlg, IDC_CROP_WIDTH);
  218. }
  219. void GetLetterboxBoxesText(HWND hDlg){
  220.                 opt_run.pp.letterboxTop    = DlgGetText(hDlg, IDC_LETTERBOX_TOP);
  221.                 opt_run.pp.letterboxBottom = DlgGetText(hDlg, IDC_LETTERBOX_BOTTOM);
  222.                 opt_run.pp.letterboxRight  = DlgGetText(hDlg, IDC_LETTERBOX_RIGHT);
  223.                 opt_run.pp.letterboxLeft   = DlgGetText(hDlg, IDC_LETTERBOX_LEFT);
  224. }
  225.  
  226. void UpdateCropAndLetterboxBoxes(HWND hDlg){
  227.     if(opt_run.pp.crop){
  228.         DlgUnCheck(hDlg, IDC_NOCROP);
  229.         EnableCropBoxes(hDlg);
  230.     }
  231.     else{
  232.         DlgCheck(hDlg, IDC_NOCROP);
  233.         DisableCropBoxes(hDlg);
  234.     }
  235.     if(opt_run.pp.letterbox){
  236.         DlgUnCheck(hDlg, IDC_NOLETTERBOX);
  237.         EnableLetterboxBoxes(hDlg);
  238.     }
  239.     else{
  240.         DlgCheck(hDlg, IDC_NOLETTERBOX);
  241.         DisableLetterboxBoxes(hDlg);
  242.     }
  243.         
  244.     SetCropBoxesText(hDlg);
  245.     SetLetterboxBoxesText(hDlg);
  246. }
  247.  
  248. // EnableCrop : Enable crop buttons
  249. void EnableCrop(HWND hDlg){
  250.     DlgEnable(hDlg, CROP_TOPOFFSET_PLUS);
  251.     DlgEnable(hDlg, CROP_TOPOFFSET_MINUS);
  252.     DlgEnable(hDlg, CROP_HEIGHT_PLUS);
  253.     DlgEnable(hDlg, CROP_HEIGHT_MINUS);
  254.     DlgEnable(hDlg, CROP_LEFTOFFSET_PLUS);
  255.     DlgEnable(hDlg, CROP_LEFTOFFSET_MINUS);
  256.     DlgEnable(hDlg, CROP_WIDTH_PLUS);
  257.     DlgEnable(hDlg, CROP_WIDTH_MINUS);
  258. }
  259. // DisableCrop : Disable crop buttons
  260. void DisableCrop(HWND hDlg){
  261.     DlgDisable(hDlg, CROP_TOPOFFSET_PLUS);
  262.     DlgDisable(hDlg, CROP_TOPOFFSET_MINUS);
  263.     DlgDisable(hDlg, CROP_HEIGHT_PLUS);
  264.     DlgDisable(hDlg, CROP_HEIGHT_MINUS);
  265.     DlgDisable(hDlg, CROP_LEFTOFFSET_PLUS);
  266.     DlgDisable(hDlg, CROP_LEFTOFFSET_MINUS);
  267.     DlgDisable(hDlg, CROP_WIDTH_PLUS);
  268.     DlgDisable(hDlg, CROP_WIDTH_MINUS);
  269. }
  270. void UpdatePadButtons(HWND hDlg){
  271.     if(opt_run.pp.crop){
  272.         DlgCheck(hDlg, IDC_CROP);
  273.         EnableCrop(hDlg);
  274.     }
  275.     else{
  276.         DlgUnCheck(hDlg, IDC_CROP);
  277.         DisableCrop(hDlg);
  278.     }
  279.     if(opt_run.pp.letterbox){
  280.         DlgCheck(hDlg, IDC_LETTERBOX);
  281.     }
  282.     else{
  283.         DlgUnCheck(hDlg, IDC_LETTERBOX);
  284.     }
  285.  
  286. }
  287. // Val: Validate post processing options and update display
  288. int Val(HWND h_display){
  289.     // Set miscelaneous parameters
  290.  
  291.     if(CheckVideoParameters(&opt_run.pp)){
  292.         UpdateDisplay(h_display);
  293.         return 1;
  294.     }
  295.     return 0;
  296. }
  297. //PAD
  298. LRESULT CALLBACK DlgPad(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  299. {
  300.     presInfo PresInfo;
  301.     TVideoOptions video_opt;
  302.     static HWND h_display;
  303.     switch (message)
  304.     {
  305.         case WM_INITDIALOG:
  306.                 // Initialize strings
  307.                 SetText(hDlg, GS(OUTPUT_PAD_TITLE));
  308.                 // Crop
  309.                 DlgSetText(hDlg, IDC_CROP, GS(OUTPUT_PAD_CROP) );
  310.                 DlgSetText(hDlg, OPT_OUTPAD_TOPOFFSET, GS(OPT_OUTPAD_TOPOFFSET));
  311.                 DlgSetText(hDlg, OPT_OUTPAD_CROPHEIGHT, GS(OPT_OUTPAD_CROPHEIGHT));
  312.                 DlgSetText(hDlg, OPT_OUTPAD_LEFTOFFSET, GS(OPT_OUTPAD_LEFTOFFSET));
  313.                 DlgSetText(hDlg, OPT_OUTPAD_CROPWIDTH, GS(OPT_OUTPAD_CROPWIDTH));
  314.                 // Output Size
  315.                 DlgSetText(hDlg, R_OUTPUT_PAD_OUTPUTSIZE, GS(OUTPUT_PAD_OUTPUTSIZE));
  316.                 DlgSetText(hDlg, OPT_OUTPAD_WIDTH, GS(OPT_OUTPAD_WIDTH));
  317.                 DlgSetText(hDlg, OPT_OUTPAD_HEIGHT, GS(OPT_OUTPAD_HEIGHT));
  318.                 DlgSetText(hDlg, IDOK , GS(OUTPUT_PAD_HIDE));
  319.  
  320.                 DlgSetText(hDlg, IDC_LETTERBOX, GS(OUTPUT_PAD_LETTERBOX));
  321.                 DlgSetText(hDlg, OPT_OUTPAD_LETTERBOX_TOP, GS(OPT_OUTPAD_LETTERBOX_TOP));
  322.                 DlgSetText(hDlg, OPT_OUTPAD_LETTERBOX_BOTTOM, GS(OPT_OUTPAD_LETTERBOX_BOTTOM));
  323.                 DlgSetText(hDlg, OPT_OUTPAD_LETTERBOX_LEFT, GS(OPT_OUTPAD_LETTERBOX_LEFT));
  324.                 DlgSetText(hDlg, OPT_OUTPAD_LETTERBOX_RIGHT, GS(OPT_OUTPAD_LETTERBOX_RIGHT));
  325.                 //Reset
  326.                 DlgSetText(hDlg, IDC_RESET, GS(OUTPUT_PAD_RESET));
  327.  
  328.  
  329.    
  330.                 // Allocate buffer memory
  331.                 if(!(opt_run.DisplayImage = (ui8 *)malloc(MAX_IMAGE_MEM)))
  332.                     return false;
  333.                 if(!(opt_run.DecodedImage = (ui8 *)malloc(MAX_IMAGE_MEM)))
  334.                     return false;
  335.  
  336.                 //Set crop checkbox
  337.                 UpdatePadButtons(hDlg);
  338.  
  339.                 UpdateVBitmaps();
  340.  
  341.                 // Create display window
  342.                 h_display = CreateNormalWindow( DisplayProc, hInst, hDlg);
  343.                 WindowHide( h_display );
  344.  
  345.                 YUVImageTag *yuv;
  346.                 // Check for video object and get a frame
  347.                 if(rs.video){
  348.                     video_opt.idctType = o.options.idctType;
  349.                     video_opt.recons_progressive = (bool) o.options.recons_progressive;
  350.                     //Seek the video to the middle
  351.                     rs.video->SeekVideo( rs.video->GetVideoSize()>>1 );
  352.                     rs.video->Start(&video_opt);
  353.                     rs.video->GetFrame(&PresInfo, &yuv);
  354.                     rs.video->Stop();
  355.                     //Yuv Convert it
  356.                     YUVtoRGB(yuv, (unsigned char *)opt_run.in.data);    
  357.                     // update iDAR
  358.                     opt_run.pp.iDAR = rs.video->DAR;
  359.                     UpdateDisplay(h_display);
  360.  
  361.                 }
  362.                 else 
  363.                     return FALSE;
  364.  
  365.                 WindowShow( h_display );
  366.                 Snap(hDlg, h_display);
  367.  
  368.                 return TRUE;
  369.         case WM_MOVE:
  370.                 Snap(hDlg, h_display);
  371.             break;
  372.         case WM_COMMAND:
  373.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  374.             {
  375.                 DestroyWindow(h_display);
  376.                 if(opt_run.DisplayImage){
  377.                     free(opt_run.DisplayImage);
  378.                     opt_run.DisplayImage=NULL;
  379.                 }
  380.                 if(opt_run.DecodedImage){
  381.                     free(opt_run.DecodedImage);
  382.                     opt_run.DecodedImage=NULL;
  383.                 }
  384.                 //Set video res
  385.                 DlgSetText(video, IDC_WIDTH, opt_run.pp.resWidth);
  386.                 DlgSetText(video, IDC_HEIGHT, opt_run.pp.resHeight);
  387.                 
  388.                 //Set crop and letterbox
  389.                 SetCropBoxesText(processing);
  390.                 SetLetterboxBoxesText(processing);
  391.                 
  392.                 UpdateCropAndLetterboxBoxes(processing);
  393.  
  394.                 EndDialog(hDlg, LOWORD(wParam));
  395.                 return TRUE;
  396.             }
  397.  
  398.             switch (LOWORD(wParam)){
  399.                 case IDC_RESET:
  400.                         opt_run.pp.crop            = 0;
  401.                         opt_run.pp.cropWidth      = rs.video->pictureWidth;
  402.                         opt_run.pp.cropHeight     = rs.video->picutreHeight;
  403.                         opt_run.pp.cropLeftOffset = 0;
  404.                         opt_run.pp.cropTopOffset  = 0;
  405.  
  406.                         opt_run.pp.letterbox       = 0;
  407.                         opt_run.pp.letterboxBottom = 0;
  408.                         opt_run.pp.letterboxLeft   = 0;
  409.                         opt_run.pp.letterboxRight  = 0;
  410.                         opt_run.pp.letterboxTop    = 0;
  411.  
  412.                         opt_run.pp.resWidth        = rs.video->pictureWidth;
  413.                         opt_run.pp.resHeight       = rs.video->picutreHeight;
  414.                         UpdateDisplay(h_display);
  415.                         UpdatePadButtons(hDlg);
  416.                     break;
  417.                 case IDC_CROP:
  418.                     opt_run.pp.crop=DlgIsChecked(hDlg, IDC_CROP);
  419.                     if(opt_run.pp.crop){
  420.                         opt_run.pp.cropWidth      = opt_run.pp.resWidth;
  421.                         opt_run.pp.cropHeight     = opt_run.pp.resHeight;
  422.                         opt_run.pp.cropLeftOffset = 0;
  423.                         opt_run.pp.cropTopOffset  = 0;
  424.                     }
  425.                     UpdateDisplay(h_display);
  426.                     UpdatePadButtons(hDlg);
  427.                     break;
  428.                 
  429.                 case IDC_LETTERBOX:
  430.                     opt_run.pp.letterbox=DlgIsChecked(hDlg, IDC_LETTERBOX);
  431.                     if(opt_run.pp.letterboxBottom<=0 &&
  432.                        opt_run.pp.letterboxLeft  <=0 && 
  433.                        opt_run.pp.letterboxRight <=0 &&
  434.                        opt_run.pp.letterboxTop   <=0){
  435.                             opt_run.pp.letterboxBottom =0;
  436.                             opt_run.pp.letterboxLeft   =0;
  437.                             opt_run.pp.letterboxRight  =0;
  438.                             opt_run.pp.letterboxTop    =0;
  439.                     }
  440.                     UpdateDisplay(h_display);
  441.                     UpdatePadButtons(hDlg);
  442.                     break;
  443.  
  444.                 case WIDTH_PLUS:
  445.                     opt_run.pp.resWidth+=16;
  446.                     if( !Val(h_display) ) opt_run.pp.resWidth-=16;
  447.                 break;
  448.                 case WIDTH_MINUS:
  449.                     opt_run.pp.resWidth-=16;
  450.                     if( !Val(h_display) ) opt_run.pp.resWidth+=16;
  451.                 break;
  452.                 case HEIGHT_PLUS:
  453.                     opt_run.pp.resHeight+=16;
  454.                     if( !Val(h_display) ) opt_run.pp.resHeight-=16;
  455.                 break;
  456.                 case HEIGHT_MINUS:
  457.                     opt_run.pp.resHeight-=16;
  458.                     if( !Val(h_display) ) opt_run.pp.resHeight+=16;
  459.                 break;
  460.                 case CROP_TOPOFFSET_PLUS:
  461.                     opt_run.pp.cropTopOffset++;
  462.                     if( !Val(h_display) ) opt_run.pp.cropTopOffset--;
  463.                 break;
  464.                 case CROP_TOPOFFSET_MINUS:
  465.                     opt_run.pp.cropTopOffset--;
  466.                     if( !Val(h_display) ) opt_run.pp.cropTopOffset++;
  467.                 break;
  468.                 case CROP_HEIGHT_PLUS:
  469.                     opt_run.pp.cropHeight+=16;
  470.                     if( !Val(h_display) ) opt_run.pp.cropHeight-=16;
  471.                 break;
  472.                 case CROP_HEIGHT_MINUS:
  473.                     opt_run.pp.cropHeight-=16;
  474.                     if( !Val(h_display) ) opt_run.pp.cropHeight+=16;
  475.                 break;
  476.                 case CROP_LEFTOFFSET_PLUS:
  477.                     opt_run.pp.cropLeftOffset++;
  478.                     if( !Val(h_display) ) opt_run.pp.cropLeftOffset--;
  479.                 break;
  480.                 case CROP_LEFTOFFSET_MINUS:
  481.                     opt_run.pp.cropLeftOffset--;
  482.                     if( !Val(h_display) ) opt_run.pp.cropLeftOffset++;
  483.                 break;
  484.                 case CROP_WIDTH_PLUS:
  485.                     opt_run.pp.cropWidth+=16;
  486.                     if( !Val(h_display) ) opt_run.pp.cropWidth-=16;
  487.                 break;
  488.                 case CROP_WIDTH_MINUS:
  489.                     opt_run.pp.cropWidth-=16;
  490.                     if( !Val(h_display) ) opt_run.pp.cropWidth+=16;
  491.                 break;
  492.                 case LETTERBOX_TOP_PLUS:
  493.                     opt_run.pp.letterboxTop++;
  494.                     if( !Val(h_display) ) opt_run.pp.letterboxTop--;
  495.                 break;
  496.                 case LETTERBOX_TOP_MINUS:
  497.                     opt_run.pp.letterboxTop--;
  498.                     if( !Val(h_display) ) opt_run.pp.letterboxTop++;
  499.                 break;
  500.                 case LETTERBOX_BOTTOM_PLUS:
  501.                     opt_run.pp.letterboxBottom++;
  502.                     if( !Val(h_display) ) opt_run.pp.letterboxBottom--;
  503.                 break;
  504.                 case LETTERBOX_BOTTOM_MINUS:
  505.                     opt_run.pp.letterboxBottom--;
  506.                     if( !Val(h_display) ) opt_run.pp.letterboxBottom++;
  507.                 break;
  508.                 case LETTERBOX_LEFT_PLUS:
  509.                     opt_run.pp.letterboxLeft++;
  510.                     if( !Val(h_display) ) opt_run.pp.letterboxLeft--;
  511.                 break;
  512.                 case LETTERBOX_LEFT_MINUS:
  513.                     opt_run.pp.letterboxLeft--;
  514.                     if( !Val(h_display) ) opt_run.pp.letterboxLeft++;
  515.                 break;
  516.                 case LETTERBOX_RIGHT_PLUS:
  517.                     opt_run.pp.letterboxRight++;
  518.                     if( !Val(h_display) ) opt_run.pp.letterboxRight--;
  519.                 break;
  520.                 case LETTERBOX_RIGHT_MINUS:
  521.                     opt_run.pp.letterboxRight--;
  522.                     if( !Val(h_display) ) opt_run.pp.letterboxRight++;
  523.                 break;
  524.             }
  525.             break;
  526.     }
  527.     return FALSE;
  528. }
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537. ///////////////////////////////////////////////////////////
  538. //             GLOBAL    OPTIONS
  539. ///////////////////////////////////////////////////////////
  540.  
  541. // Retrieve timebase from video options tab
  542. void GetFrameRate(HWND hDlg, compTimebaseRec *timebase){
  543.  
  544.     if(DlgIsChecked(hDlg,IDC_TB23)){ //23.976
  545.         //HACK: LSX ENCODER DOESNT LIKE RIGHT TIMEBASE
  546.         timebase->scale=        23976;
  547.         timebase->sampleSize=    1000;
  548.     }else if(DlgIsChecked(hDlg,IDC_TB24)){
  549.         timebase->scale=        24;
  550.         timebase->sampleSize=    1;
  551.     }else if(DlgIsChecked(hDlg,IDC_TB29)){
  552.         timebase->scale=        2997;
  553.         timebase->sampleSize=    100;
  554.     }else if(DlgIsChecked(hDlg,IDC_TB30)){
  555.         timebase->scale=        30;
  556.         timebase->sampleSize=    1;
  557.     }else {
  558.         timebase->scale=        25;
  559.         timebase->sampleSize=    1;
  560.     }
  561. }
  562.  
  563.     // OnChildDialogInit - Positions the child dialog box to fall 
  564.     //     within the display area of the tab control. 
  565.  
  566.     VOID WINAPI OnChildDialogInit(HWND hwndDlg) 
  567.     { 
  568.     HWND hwndParent = GetParent(hwndDlg); 
  569.     DLGHDR *pHdr = (DLGHDR *) GetWindowLong( 
  570.         hwndParent, GWL_USERDATA); 
  571.     SetWindowPos(hwndDlg, HWND_TOP, 
  572.         pHdr->rcDisplay.left, pHdr->rcDisplay.top, 
  573.         0, 0, SWP_NOSIZE); 
  574.     } 
  575.  
  576.  
  577. void GetFilter(HWND hDlg){
  578.     // Check filter settings
  579.     if(DlgIsChecked(hDlg, R_OPT_PPOST_RESIZING_NEAREST))
  580.         opt_run.pp.filterMode=FILTER_NONE;
  581.     else if(DlgIsChecked(hDlg, R_OPT_PPOST_RESIZING_BILINEAR))
  582.         opt_run.pp.filterMode=FILTER_BILINEAR;
  583.     else if(DlgIsChecked(hDlg, R_OPT_PPOST_RESIZING_BICUBIC))
  584.         opt_run.pp.filterMode=FILTER_BICUBIC;
  585.     else if(DlgIsChecked(hDlg, R_OPT_PPOST_RESIZING_HQBICUBIC))
  586.         opt_run.pp.filterMode=FILTER_TABLEBICUBIC;
  587.     else 
  588.         opt_run.pp.filterMode=FILTER_TABLEBICUBIC;
  589. }
  590. LRESULT CALLBACK DlgProcessing(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  591. {
  592.     switch (message)
  593.     {
  594.         case WM_INITDIALOG:
  595.                 OnChildDialogInit(hDlg);
  596.                 //CROP
  597.  
  598.                 UpdateCropAndLetterboxBoxes(hDlg);
  599.  
  600.  
  601.                 switch(o.options.filter)
  602.                 {
  603.                     case FILTER_NONE:
  604.                         DlgCheck( hDlg, R_OPT_PPOST_RESIZING_NEAREST);
  605.                         break;
  606.                     case FILTER_BILINEAR:
  607.                         DlgCheck( hDlg, R_OPT_PPOST_RESIZING_BILINEAR);
  608.                         break;
  609.                     case FILTER_BICUBIC:
  610.                         DlgCheck( hDlg, R_OPT_PPOST_RESIZING_BICUBIC);
  611.                         break;
  612.                     case FILTER_TABLEBICUBIC:
  613.                         DlgCheck( hDlg, R_OPT_PPOST_RESIZING_HQBICUBIC);
  614.                         break;
  615.                 }
  616.                 if(o.options.keepAspect) 
  617.                     DlgCheck(hDlg, R_OPT_PPOST_KEEPASPECT);
  618.                 else 
  619.                     DlgUnCheck(hDlg, R_OPT_PPOST_KEEPASPECT);
  620.                 return TRUE;
  621.  
  622.         case WM_COMMAND:
  623.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  624.             {
  625.                 EndDialog(hDlg, LOWORD(wParam));
  626.                 return TRUE;
  627.             }
  628.             
  629.             switch(LOWORD(wParam)){
  630.                 case R_OPT_PPOST_KEEPASPECT:
  631.                     opt_run.pp.doAR = DlgIsChecked(processing, R_OPT_PPOST_KEEPASPECT);
  632.                     break;
  633.                 case IDC_SHOWPAD:
  634.                     DialogBox(hInst, MAKEINTRESOURCE(DLG_OUTPUT_PAD), hDlg, (DLGPROC)DlgPad);
  635.                     break;
  636.  
  637.                 case IDC_NOCROP:
  638.                     opt_run.pp.crop=!DlgIsChecked(hDlg, IDC_NOCROP);
  639.                     if(opt_run.pp.crop)
  640.                         EnableCropBoxes(hDlg);
  641.                     else
  642.                         DisableCropBoxes(hDlg);
  643.                     break;
  644.                 case IDC_NOLETTERBOX:
  645.                     opt_run.pp.letterbox = !DlgIsChecked(hDlg, IDC_NOLETTERBOX);
  646.                     if(opt_run.pp.letterbox )
  647.                         EnableLetterboxBoxes(hDlg);
  648.                     else
  649.                         DisableLetterboxBoxes(hDlg);
  650.                     break;
  651.                 case R_OPT_PPOST_RESIZING_NEAREST:
  652.                     GetFilter(hDlg); break;
  653.                 case R_OPT_PPOST_RESIZING_BILINEAR:
  654.                     GetFilter(hDlg); break;
  655.                 case R_OPT_PPOST_RESIZING_BICUBIC:
  656.                     GetFilter(hDlg); break;
  657.                 case R_OPT_PPOST_RESIZING_HQBICUBIC:
  658.                     GetFilter(hDlg); break;
  659.  
  660.                 break;
  661.             }
  662.             break;
  663.     }
  664.     return FALSE;
  665.  
  666. }
  667.  
  668.  
  669. /* Update settings from hDlg's video section.  If all settings are valid, return
  670.  * true; if any setting is incorrect, print a warning, set focus on the erroneous
  671.  * entry and return false.
  672.  */
  673. static bool DlgVideo_Check(HWND hDlg)
  674. {
  675.     if(DlgGetText(hDlg, IDC_WIDTH)<=0 || DlgGetText(hDlg, IDC_WIDTH)>=1024){
  676.         PrintError(SIZE_OOR,(int)hDlg,0);
  677.         DlgSetFocus(hDlg, IDC_WIDTH);
  678.         return false;
  679.     }
  680.  
  681.     if((DlgGetText(hDlg, IDC_WIDTH)%16)!=0){
  682.         PrintError(SIZE_NOT16,(int)hDlg,0);
  683.         DlgSetFocus(hDlg, IDC_WIDTH);
  684.         return false;
  685.     }
  686.  
  687.     if(DlgGetText(hDlg, IDC_HEIGHT)<=0 || DlgGetText(hDlg, IDC_HEIGHT)>=1024){
  688.         PrintError(SIZE_OOR,(int)hDlg,0);
  689.         DlgSetFocus(hDlg, IDC_HEIGHT);
  690.         return false;
  691.     }
  692.     if((DlgGetText(hDlg, IDC_HEIGHT)%16)!=0){
  693.         PrintError(SIZE_NOT16,(int)hDlg,0);
  694.         DlgSetFocus(hDlg, IDC_WIDTH);
  695.         return false;
  696.     }
  697.  
  698.     opt_run.pp.resWidth = DlgGetText(hDlg, IDC_WIDTH);
  699.     opt_run.pp.resHeight = DlgGetText(hDlg, IDC_HEIGHT);
  700.     return true;
  701. }
  702.  
  703. static bool DlgProcessing_Check(HWND hDlg)
  704. {
  705.     GetLetterboxBoxesText(hDlg);
  706.     GetCropBoxesText(hDlg);
  707.  
  708.     if(!CheckVideoParameters(&opt_run.pp)){
  709.         PrintError(INCORRECT_SETTING, (int)hDlg,0);
  710.         /* FIXME: we need to know where to set focus, but what's a
  711.          * clean way to do this without duplicating CheckVideoParameters() code? */
  712.         // DlgSetFocus(hDlg, LOWORD(wParam));
  713.         return false;
  714.     }
  715.  
  716.     return true;
  717. }
  718. static bool DlgGeneral_Check(HWND hDlg)
  719. {
  720.     char szTemp[256];
  721.  
  722.     if(DlgIsChecked(hDlg,IDC_COMPILE_WHOLE)) return true; /* don't bother */
  723.  
  724.     GetDlgItemText( hDlg, IDC_COMPILE_TIME, szTemp, 1024);
  725.     if(!atof(szTemp)){
  726.         PrintError(TIME_IS_NOT_POSITIVE, (int)hDlg,0);
  727.         DlgSetFocus(hDlg, IDC_COMPILE_TIME);
  728.         return false;
  729.     }
  730.  
  731.     if(o.options.displayTimeUnits == 0) {
  732.         /* it's in seconds; switch to frames */
  733.         compTimebaseRec timebase;
  734.         GetFrameRate(video, &timebase);
  735.  
  736.         GetDlgItemText( hDlg, IDC_COMPILE_TIME, szTemp, 1024);
  737.         opt_run.opt.frames_compile = (int)(atof(szTemp) * GET_FRAMERATE(timebase));
  738.     } else {
  739.         /* it's in frames; copy it directly */
  740.         GetDlgItemText( hDlg, IDC_COMPILE_TIME, szTemp, 1024);
  741.         opt_run.opt.frames_compile = atoi(szTemp);
  742.     } 
  743.  
  744.     return true;
  745. }
  746. LRESULT CALLBACK DlgVideo(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  747. {
  748.     switch (message)
  749.     {
  750.         case WM_INITDIALOG:
  751.                 OnChildDialogInit(hDlg);
  752.                 DlgSetText(hDlg, IDC_WIDTH, opt_run.pp.resWidth);
  753.                 DlgSetText(hDlg, IDC_HEIGHT, opt_run.pp.resHeight);
  754.                 
  755.                 switch( o.options.timeBase.scale )
  756.                 {
  757.                     case 23976: //23.976
  758.                             DlgCheck(hDlg, IDC_TB23);
  759.                         break;
  760.                     case 24:    //24
  761.                             DlgCheck(hDlg, IDC_TB24);
  762.                         break; 
  763.                     case 2997: //29.97
  764.                             DlgCheck(hDlg, IDC_TB29);
  765.                             DlgDisable(hDlg, R_OPT_TIMEBASE_RECONS);
  766.                             o.options.recons_progressive = 0;
  767.                         break;
  768.                     case 30:    //30
  769.                             DlgCheck(hDlg, IDC_TB30);
  770.                             DlgDisable(hDlg, R_OPT_TIMEBASE_RECONS);
  771.                             o.options.recons_progressive = 0;
  772.                         break;
  773.                     default:    //if not, set 25
  774.                             DlgCheck(hDlg, IDC_TB25);
  775.                             DlgDisable(hDlg, R_OPT_TIMEBASE_RECONS);
  776.                             o.options.recons_progressive = 0;
  777.  
  778.                         break;
  779.                 }
  780.                 switch(o.options.idctType)
  781.                 {
  782.                     case IDCT_MMX:
  783.                         DlgCheck( hDlg, R_OPT_IDCT_MMX);
  784.                         break;
  785.                     case IDCT_NORMAL:
  786.                         DlgCheck( hDlg, R_OPT_IDCT_NONMMX);
  787.                         break;
  788.                     case IDCT_IEEE:
  789.                         DlgCheck( hDlg, R_OPT_IDCT_REF);
  790.                         break;
  791.                 }
  792.  
  793.                 DlgSetText(hDlg, R_OPT_VIDEO_DEINTERLACE_THRESHOLD, o.options.threshold);
  794.                 DlgCheckBoxState( hDlg, R_OPT_TIMEBASE_RECONS, o.options.recons_progressive);
  795.                 DlgCheckBoxState( hDlg, R_OPT_VIDEO_DEINTERLACE_CHECK, o.options.deinterlace);
  796.                 DlgCheckBoxState( hDlg, R_OPT_VIDEO_DEINTERLACE_BLEND, o.options.blend);
  797.                 if(o.options.deinterlace)
  798.                 {
  799.                     DlgEnable(hDlg, R_OPT_VIDEO_DEINTERLACE_BLEND);
  800.                     DlgEnable(hDlg, R_OPT_VIDEO_DEINTERLACE_THRESHOLD);
  801.                 }
  802.                 else
  803.                 {
  804.                     DlgDisable(hDlg, R_OPT_VIDEO_DEINTERLACE_BLEND);
  805.                     DlgDisable(hDlg, R_OPT_VIDEO_DEINTERLACE_THRESHOLD);
  806.                 }
  807.  
  808.  
  809.                 return TRUE;
  810.  
  811.         case WM_COMMAND:
  812.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  813.             {
  814.                 EndDialog(hDlg, LOWORD(wParam));
  815.                 return TRUE;
  816.             }
  817.             // framerate
  818.             switch(LOWORD(wParam))
  819.             {
  820.                 case R_OPT_VIDEO_DEINTERLACE_CHECK:
  821.                     if(DlgIsChecked(hDlg, R_OPT_VIDEO_DEINTERLACE_CHECK) )
  822.                     {
  823.                         DlgEnable(hDlg, R_OPT_VIDEO_DEINTERLACE_BLEND);
  824.                         DlgEnable(hDlg, R_OPT_VIDEO_DEINTERLACE_THRESHOLD);
  825.                     }
  826.                     else
  827.                     {
  828.                         DlgDisable(hDlg, R_OPT_VIDEO_DEINTERLACE_BLEND);
  829.                         DlgDisable(hDlg, R_OPT_VIDEO_DEINTERLACE_THRESHOLD);
  830.                     }
  831.                     break;
  832.                 case IDC_TB23: 
  833.                 case IDC_TB24:
  834.                         DlgEnable(hDlg, R_OPT_TIMEBASE_RECONS);
  835.                     break; 
  836.                 case IDC_TB25:
  837.                 case IDC_TB29:
  838.                 case IDC_TB30:
  839.                         DlgDisable(hDlg, R_OPT_TIMEBASE_RECONS);
  840.                         o.options.recons_progressive = 0;
  841.                     break;
  842.             }
  843.     }
  844.     return FALSE;
  845. }
  846.  
  847.  
  848. LRESULT CALLBACK DlgAudio(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  849. {
  850.     switch (message)
  851.     {
  852.         case WM_INITDIALOG:
  853.                 OnChildDialogInit(hDlg);
  854.                 //Setting init options
  855.                 
  856.                 if(rs.audio){
  857.     //                if(rs.audio->isMPEG)
  858.                     //    DlgDisable(hDlg, IDC_DOAUDIO);
  859.                     if(!rs.audio->isMPEG  &&  !rs.audio->isAC3 ){
  860.                         DlgDisable(hDlg, R_OPT_AUDIO_DOAUDIO);
  861.                         DlgDisable(hDlg, R_OPT_AUDIO_DSC);
  862.                     }
  863.                 }
  864.                 else{
  865.                         DlgDisable(hDlg, R_OPT_AUDIO_DOAUDIO);
  866.                         DlgDisable(hDlg, R_OPT_AUDIO_DSC);
  867.                 }
  868.                 if(o.options.outSampleFrequency==44100)
  869.                     DlgCheck(hDlg, IDC_44100);
  870.                 else
  871.                     DlgCheck(hDlg, IDC_48000);
  872.                 switch( o.options.audioMode ){
  873.                     case DO_AUDIO:
  874.                         DlgCheck(hDlg, R_OPT_AUDIO_DOAUDIO);
  875.                         DlgDisable(files, IDC_OUTPUT_FILE2);
  876.                         DlgDisable(files, IDC_FILEBUTTON2);
  877.                         if(o.options.sampleFreqSameAsInput){
  878.                             DlgDisable(hDlg, IDC_48000);
  879.                             DlgDisable(hDlg, IDC_44100);
  880.                             DlgCheck(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  881.                         }
  882.                         else{
  883.                             DlgEnable(hDlg, IDC_48000);
  884.                             DlgEnable(hDlg, IDC_44100);
  885.                             DlgUnCheck(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  886.                         }
  887.                         DlgEnable(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  888.                         break;
  889.                     case DSC:
  890.                         DlgCheck(hDlg, R_OPT_AUDIO_DSC);
  891.                         DlgEnable(files, IDC_OUTPUT_FILE2);
  892.                         DlgEnable(files, IDC_FILEBUTTON2);
  893.                         DlgDisable(hDlg, IDC_48000);
  894.                         DlgDisable(hDlg, IDC_44100);
  895.                         DlgDisable(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  896.                         break;
  897.                     case NO_AUDIO:
  898.                         DlgCheck(hDlg, R_OPT_AUDIO_NOAUDIO);
  899.                         DlgDisable(files, IDC_OUTPUT_FILE2);
  900.                         DlgDisable(files, IDC_FILEBUTTON2);
  901.                         DlgDisable(hDlg, IDC_48000);
  902.                         DlgDisable(hDlg, IDC_44100);
  903.                         DlgDisable(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  904.                         break;
  905.                 }
  906.                 return TRUE;
  907.  
  908.         case WM_COMMAND:
  909.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  910.             {
  911.                 EndDialog(hDlg, LOWORD(wParam));
  912.                 return TRUE;
  913.             }
  914.             switch(LOWORD(wParam)){
  915.                 case R_OPT_AUDIO_SAMPLING_SAMEASINPUT:
  916.                     if(DlgIsChecked(hDlg,R_OPT_AUDIO_SAMPLING_SAMEASINPUT))
  917.                     {
  918.                         DlgDisable(hDlg, IDC_48000);
  919.                         DlgDisable(hDlg, IDC_44100);
  920.                     }
  921.                     else{
  922.                         DlgEnable(hDlg, IDC_48000);
  923.                         DlgEnable(hDlg, IDC_44100);
  924.                     }
  925.                     break;
  926.                 case R_OPT_AUDIO_DOAUDIO:
  927.                     DlgDisable(files, IDC_OUTPUT_FILE2);
  928.                     DlgDisable(files, IDC_FILEBUTTON2);
  929.                     if(o.options.sampleFreqSameAsInput){
  930.                         DlgDisable(hDlg, IDC_48000);
  931.                         DlgDisable(hDlg, IDC_44100);
  932.                         DlgCheck(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  933.                     }
  934.                     else{
  935.                         DlgEnable(hDlg, IDC_48000);
  936.                         DlgEnable(hDlg, IDC_44100);
  937.                         DlgUnCheck(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  938.                     }
  939.                     DlgEnable(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  940.                     break;
  941.                 case R_OPT_AUDIO_DSC:
  942.                     DlgEnable(files, IDC_OUTPUT_FILE2);
  943.                     DlgEnable(files, IDC_FILEBUTTON2);
  944.                     DlgDisable(hDlg, IDC_48000);
  945.                     DlgDisable(hDlg, IDC_44100);
  946.                     DlgDisable(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  947.                     break;
  948.                 case R_OPT_AUDIO_NOAUDIO:
  949.                     DlgDisable(files, IDC_OUTPUT_FILE2);
  950.                     DlgDisable(files, IDC_FILEBUTTON2);
  951.                     DlgDisable(hDlg, IDC_48000);
  952.                     DlgDisable(hDlg, IDC_44100);
  953.                     DlgDisable(hDlg, R_OPT_AUDIO_SAMPLING_SAMEASINPUT);
  954.                     break;
  955.             }
  956.             break;
  957.     }
  958.     return FALSE;
  959. }
  960.  
  961.  
  962.  
  963. LRESULT CALLBACK DlgGeneral(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  964. {
  965.     char szTemp[1024];
  966.     switch (message)
  967.     {
  968.         case WM_INITDIALOG:
  969.             OnChildDialogInit(hDlg);
  970.                 if(o.options.compileWhole){
  971.                     // whole file
  972.                     DlgCheck( hDlg, IDC_COMPILE_WHOLE);
  973.                     // disable edit box and unit selection
  974.                     DlgDisable( hDlg, IDC_COMPILE_TIME);
  975.                     DlgDisable( hDlg, R_GENERAL_COMPTIME_SECONDSCOMPILE);
  976.                     DlgDisable( hDlg, R_GENERAL_COMPTIME_FRAMESCOMPILE);
  977.                 }
  978.                 else
  979.                 {
  980.                     DlgEnable(hDlg, IDC_COMPILE_TIME);
  981.                     DlgEnable(hDlg, R_GENERAL_COMPTIME_SECONDSCOMPILE);
  982.                     DlgEnable(hDlg, R_GENERAL_COMPTIME_FRAMESCOMPILE);
  983.                 }
  984.  
  985.                 opt_run.opt.frames_compile = o.options.framesToCompile;
  986.                 
  987.                 /* make sure we have a sane frame count, and not our magic '300000' */
  988.                 if(o.options.compileWhole) opt_run.opt.frames_compile = 100;
  989.  
  990.                 if(o.options.displayTimeUnits == 0) {
  991.                     /* secs */
  992.                     compTimebaseRec timebase;
  993.                     GetFrameRate(video, &timebase);
  994.  
  995.                     DlgSetDouble( hDlg, IDC_COMPILE_TIME, o.options.framesToCompile / GET_FRAMERATE(timebase));
  996.                     DlgCheck(hDlg, R_GENERAL_COMPTIME_SECONDSCOMPILE);
  997.                 } else if(o.options.displayTimeUnits == 1) {
  998.                     /* frames */
  999.                     DlgSetText( hDlg, IDC_COMPILE_TIME, o.options.framesToCompile);
  1000.                     DlgCheck(hDlg, R_GENERAL_COMPTIME_FRAMESCOMPILE);
  1001.                 }
  1002.  
  1003.                 DlgSetText(hDlg, IDC_LURKSIZE, o.options.lurk_size );
  1004.  
  1005.                 if(o.options.shutdown)
  1006.                     DlgCheck(hDlg, R_GENERAL_MISC_SHUTDOWN);
  1007.                 else
  1008.                     DlgUnCheck(hDlg, R_GENERAL_MISC_SHUTDOWN);
  1009.  
  1010.                 return TRUE;
  1011.  
  1012.         case WM_COMMAND:
  1013.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  1014.             {
  1015.                 EndDialog(hDlg, LOWORD(wParam));
  1016.                 return TRUE;
  1017.             }
  1018.             switch(LOWORD(wParam)){
  1019.                 case IDC_COMPILE_WHOLE:
  1020.                     o.options.compileWhole = DlgIsChecked(hDlg,IDC_COMPILE_WHOLE);
  1021.                     if(o.options.compileWhole){
  1022.                         // whole file
  1023.                         DlgCheck( hDlg, IDC_COMPILE_WHOLE);
  1024.                         // disable edit box and unit selection
  1025.                         DlgDisable( hDlg, IDC_COMPILE_TIME);
  1026.                         DlgDisable( hDlg, R_GENERAL_COMPTIME_SECONDSCOMPILE);
  1027.                         DlgDisable( hDlg, R_GENERAL_COMPTIME_FRAMESCOMPILE);
  1028.                     }
  1029.                     else
  1030.                     {
  1031.                         DlgEnable(hDlg, IDC_COMPILE_TIME);
  1032.                         DlgEnable(hDlg, R_GENERAL_COMPTIME_SECONDSCOMPILE);
  1033.                         DlgEnable(hDlg, R_GENERAL_COMPTIME_FRAMESCOMPILE);
  1034.                     }
  1035.  
  1036.                     break;
  1037.                 case R_GENERAL_COMPTIME_SECONDSCOMPILE:
  1038.                     if(HIWORD(wParam) == BN_CLICKED && o.options.displayTimeUnits == 1) {
  1039.                         /* switch IDC_COMPILE_TIME to seconds */                        
  1040.                         compTimebaseRec timebase;
  1041.                         GetFrameRate(video, &timebase);
  1042.  
  1043.                         GetDlgItemText( hDlg, IDC_COMPILE_TIME, szTemp, 1024);
  1044.                         DlgSetDouble( hDlg, IDC_COMPILE_TIME, atoi(szTemp) / GET_FRAMERATE(timebase));
  1045.                         o.options.displayTimeUnits = 0;
  1046.                     }
  1047.                     
  1048.  
  1049.                     break;
  1050.                 case R_GENERAL_COMPTIME_FRAMESCOMPILE:
  1051.                     if(HIWORD(wParam) == BN_CLICKED && o.options.displayTimeUnits == 0) {
  1052.                         /* switch IDC_COMPILE_TIME to frames */
  1053.                         compTimebaseRec timebase;
  1054.                         GetFrameRate(video, &timebase);
  1055.  
  1056.                         GetDlgItemText( hDlg, IDC_COMPILE_TIME, szTemp, 1024);
  1057.                         DlgSetText( hDlg, IDC_COMPILE_TIME, (int) (atof(szTemp) * GET_FRAMERATE(timebase)));
  1058.                         o.options.displayTimeUnits = 1;
  1059.                     }
  1060.  
  1061.                     break;
  1062.             }
  1063.             break;
  1064.     }
  1065.     return FALSE;
  1066. }
  1067.  
  1068. LRESULT CALLBACK DlgFiles(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  1069. {
  1070.     char szTemp[MAXFILENAME];
  1071.  
  1072.     switch (message)
  1073.     {
  1074.         case WM_INITDIALOG:
  1075.             OnChildDialogInit(hDlg);
  1076.                 DlgSetText(hDlg, IDC_OUTPUT_FILE1, o.options.outputFile);
  1077.                 DlgSetText(hDlg, IDC_OUTPUT_FILE2, o.options.audioOutFile);    
  1078.             if(o.options.warn_overwrite)
  1079.                 DlgCheck(hDlg, R_FILES_WARN);
  1080.             else
  1081.                 DlgUnCheck(hDlg, R_FILES_WARN);
  1082.                 return TRUE;
  1083.  
  1084.         case WM_COMMAND:
  1085.             if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
  1086.             {
  1087.                 EndDialog(hDlg, LOWORD(wParam));
  1088.                 return TRUE;
  1089.             }
  1090.             switch(LOWORD(wParam)){
  1091.                 case IDC_FILEBUTTON1:
  1092.                     strcpy( szTemp, o.options.outputFile);
  1093.                     if(GetOutputFileName(hDlg, szTemp, o.options.outputDir, "FlasK MPEG - Select output video file")){
  1094.                         DlgSetText(hDlg, IDC_OUTPUT_FILE1, szTemp);
  1095.                     }
  1096.                     break;
  1097.                 case IDC_FILEBUTTON2:
  1098.                     strcpy( szTemp, o.options.audioOutFile);
  1099.                     if(GetOutputFileName(hDlg, szTemp, o.options.outputDir, "FlasK MPEG - Select output audio file")){
  1100.                         DlgSetText(hDlg, IDC_OUTPUT_FILE2, szTemp);
  1101.                     }
  1102.                     break;
  1103.             }
  1104.             break;
  1105.     }
  1106.     return FALSE;
  1107. }
  1108. // DoLockDlgRes - loads and locks a dialog template resource. 
  1109. // Returns the address of the locked resource. 
  1110. // lpszResName - name of the resource 
  1111. DLGTEMPLATE * WINAPI DoLockDlgRes(LPCSTR lpszResName) 
  1112.     HRSRC hrsrc = FindResource(NULL, lpszResName, RT_DIALOG); 
  1113.     HGLOBAL hglb = LoadResource(hInst, hrsrc); 
  1114.     return (DLGTEMPLATE *) LockResource(hglb); 
  1115.  
  1116.  
  1117. // OnSelChanged - processes the TCN_SELCHANGE notification. 
  1118. // hwndDlg - handle to the parent dialog box. 
  1119. VOID WINAPI OnSelChanged(HWND hwndDlg) 
  1120.         DLGHDR *pHdr = (DLGHDR *) GetWindowLong( 
  1121.         hwndDlg, GWL_USERDATA); 
  1122.     int iSel =o.options.selectedTab= TabCtrl_GetCurSel(pHdr->hwndTab); 
  1123.  
  1124.     // Hide the current child dialog box, if any. 
  1125.     if (pHdr->hwndDisplay != NULL) 
  1126.         ShowWindow(pHdr->hwndDisplay,SW_HIDE); 
  1127.  
  1128.     // Show. 
  1129.     pHdr->hwndDisplay = pHdr->DlgTabs[iSel];
  1130.         ShowWindow(pHdr->hwndDisplay,SW_SHOW);
  1131.  
  1132.  
  1133. VOID WINAPI TabbedDialogInit(HWND hwndDlg) 
  1134.     pHdr = (DLGHDR *) LocalAlloc(LPTR, sizeof(DLGHDR)); 
  1135.     DWORD dwDlgBase = GetDialogBaseUnits(); 
  1136.     int cxMargin = LOWORD(dwDlgBase) / 4; 
  1137.     int cyMargin = HIWORD(dwDlgBase) / 8; 
  1138.     TCITEM tie; 
  1139.     RECT rcTab; 
  1140.  
  1141.  
  1142.     // Save a pointer to the DLGHDR structure. 
  1143.     SetWindowLong(hwndDlg, GWL_USERDATA, (LONG) pHdr); 
  1144.  
  1145.     // Create the tab control. 
  1146.     InitCommonControls(); 
  1147.     pHdr->hwndTab = CreateWindow( 
  1148.         WC_TABCONTROL, "", 
  1149.         WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 
  1150.         0, 0, 100, 100, 
  1151.         hwndDlg, NULL, hInst, NULL 
  1152.         ); 
  1153.     if (pHdr->hwndTab == NULL) {
  1154.         return ;
  1155.     }
  1156.     // Set font
  1157.     SendMessage(pHdr->hwndTab, WM_SETFONT, (WPARAM)myFont, MAKELPARAM(TRUE, 0));    
  1158.  
  1159.     // Add a tab for each of the three child dialog boxes. 
  1160.     tie.mask = TCIF_TEXT | TCIF_IMAGE; 
  1161.     tie.iImage = -1; 
  1162.     tie.pszText = "Video"; 
  1163.     TabCtrl_InsertItem(pHdr->hwndTab, 0, &tie); 
  1164.     tie.pszText = "Audio"; 
  1165.     TabCtrl_InsertItem(pHdr->hwndTab, 1, &tie); 
  1166.     tie.pszText = "Post Processing"; 
  1167.     TabCtrl_InsertItem(pHdr->hwndTab, 2, &tie); 
  1168.      tie.pszText = "Files"; 
  1169.     TabCtrl_InsertItem(pHdr->hwndTab, 3, &tie); 
  1170.      tie.pszText = "General"; 
  1171.     TabCtrl_InsertItem(pHdr->hwndTab, 4, &tie); 
  1172.  
  1173.  
  1174.     SetRectEmpty(&rcTab); 
  1175.     rcTab.right = (292 * LOWORD(dwDlgBase)) / 4; 
  1176.     rcTab.bottom = (130 * HIWORD(dwDlgBase)) / 8; 
  1177.  
  1178.     // Calculate how large to make the tab control, so 
  1179.     // the display area can accommodate all the child dialog boxes. 
  1180.     TabCtrl_AdjustRect(pHdr->hwndTab, TRUE, &rcTab); 
  1181.     OffsetRect(&rcTab, cxMargin - rcTab.left, 
  1182.             cyMargin - rcTab.top); 
  1183.  
  1184.     // Calculate the display rectangle. 
  1185.     CopyRect(&pHdr->rcDisplay, &rcTab); 
  1186.     TabCtrl_AdjustRect(pHdr->hwndTab, FALSE, &pHdr->rcDisplay); 
  1187.  
  1188.     // Set the size and position of the tab control, buttons, 
  1189.     // and dialog box. 
  1190.     SetWindowPos(pHdr->hwndTab, NULL, rcTab.left, rcTab.top, 
  1191.             rcTab.right - rcTab.left, rcTab.bottom - rcTab.top, 
  1192.             SWP_NOZORDER); 
  1193.  
  1194.   
  1195.     //Create dialogs
  1196.     // files tab has dependences from all the others (audio)
  1197.     files=        pHdr->DlgTabs[3]=CreateDialog(hInst, MAKEINTRESOURCE(DLG_FILES), hwndDlg, (DLGPROC)DlgFiles);
  1198.  
  1199.     video=        pHdr->DlgTabs[0]=CreateDialog(hInst, MAKEINTRESOURCE(DLG_VIDEO_OPTIONS), hwndDlg, (DLGPROC)DlgVideo);
  1200.     audio=        pHdr->DlgTabs[1]=CreateDialog(hInst, MAKEINTRESOURCE(DLG_AUDIO_OPTIONS), hwndDlg, (DLGPROC)DlgAudio);
  1201.     processing=    pHdr->DlgTabs[2]=CreateDialog(hInst, MAKEINTRESOURCE(DLG_PROCESSING_OPTIONS), hwndDlg, (DLGPROC)DlgProcessing);
  1202.     general=    pHdr->DlgTabs[4]=CreateDialog(hInst, MAKEINTRESOURCE(DLG_GENERAL), hwndDlg, (DLGPROC)DlgGeneral);
  1203.  
  1204.     pHdr->DlgTabCheck[0] = DlgVideo_Check;
  1205.     pHdr->DlgTabCheck[1] = pHdr->DlgTabCheck[3] = pHdr->DlgTabCheck[5] = NULL;
  1206.     pHdr->DlgTabCheck[2] = DlgProcessing_Check;
  1207.     pHdr->DlgTabCheck[4] = DlgGeneral_Check;
  1208.  
  1209.     // Select Tab from options
  1210.     TabCtrl_SetCurSel(pHdr->hwndTab, o.options.selectedTab);
  1211.     OnSelChanged(hwndDlg); 
  1212.     
  1213.  
  1214.  
  1215.  
  1216.  
  1217. // Mesage handler for output options
  1218. LRESULT CALLBACK OutputOptionsDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  1219. {
  1220.     
  1221.     static LOGFONT logFont;
  1222.     switch (message)
  1223.     {
  1224.         case WM_INITDIALOG:
  1225.             //Get post processing options from config
  1226.             GetPPostConfig(&o, &opt_run.pp);
  1227.  
  1228.             strcpy(logFont.lfFaceName,"MS Sans Serif");
  1229.             logFont.lfWeight=FW_NORMAL;
  1230.             logFont.lfHeight=8; 
  1231.             myFont=CreateFontIndirect(&logFont);
  1232.             TabbedDialogInit(hDlg);
  1233.             
  1234.             // SET LANGUAGE
  1235.             DlgSetText(hDlg, IDOK,GS(OPT_OK));
  1236.             DlgSetText(hDlg, IDCANCEL,GS(OPT_CANCEL));
  1237.             DlgSetText(hDlg, IDC_SHOWPAD ,GS(OPT_SHOWPAD));
  1238.             DlgSetText(hDlg, IDC_1, GS(OPT_SHOWPAD_EXP));
  1239.             SetText(hDlg, GS(OPT_TITLE));
  1240.             // Setting Tabs
  1241.             TabSetText(pHdr->hwndTab, 0, GS(OPT_VIDEO) );
  1242.             TabSetText(pHdr->hwndTab, 1, GS(OPT_AUDIO) );
  1243.             TabSetText(pHdr->hwndTab, 2, GS(OPT_PPOST) );
  1244.             TabSetText(pHdr->hwndTab, 3, GS(OPT_FILES) );
  1245.             TabSetText(pHdr->hwndTab, 4, GS(OPT_GENERAL) );
  1246.             // Video
  1247.             DlgSetText(video, R_OPT_FRAMESIZE, GS(OPT_FRAMESIZE));
  1248.             DlgSetText(video, R_OPT_WIDTH, GS(OPT_WIDTH));
  1249.             DlgSetText(video, R_OPT_HEIGHT, GS(OPT_HEIGHT));
  1250.             DlgSetText(video, R_OPT_FRAMESIZE_EXP, GS(OPT_FRAMESIZE_EXP));
  1251.             DlgSetText(video, R_OPT_OUTPAD_EXP, GS(OPT_OUTPAD_EXP));
  1252.             DlgSetText(video, R_OPT_TIMEBASE, GS(OPT_TIMEBASE));
  1253.             DlgSetText(video, R_OPT_TIMEBASE_RECONS, GS(R_OPT_TIMEBASE_RECONS) );
  1254.             DlgSetText(video, R_OPT_TIMEBASE_EXP, GS(OPT_TIMEBASE_EXP));
  1255.             DlgSetText(video, R_OPT_IDCT_TITLE, GS(OPT_IDCT_TITLE));
  1256.             DlgSetText(video, R_OPT_IDCT_EXP, GS(OPT_IDCT_EXP));
  1257.             DlgSetText(video, R_OPT_IDCT_MMX, GS(OPT_IDCT_MMX));
  1258.             DlgSetText(video, R_OPT_IDCT_NONMMX, GS(OPT_IDCT_NONMMX));
  1259.             DlgSetText(video, R_OPT_IDCT_REF, GS(OPT_IDCT_REF));
  1260.             DlgSetText(video, R_OPT_VIDEO_NOTE, GS(OPT_VIDEO_NOTE));
  1261.             
  1262.             DlgSetText(video, R_OPT_VIDEO_VIDEOSTRUCTURE, GS(R_OPT_VIDEO_VIDEOSTRUCTURE));
  1263.             DlgSetText(video, R_OPT_VIDEO_DEINTERLACE_CHECK, GS(R_OPT_VIDEO_DEINTERLACE_CHECK));
  1264.             DlgSetText(video, R_OPT_VIDEO_DEINTERLACE_BLEND, GS(R_OPT_VIDEO_DEINTERLACE_BLEND));
  1265.             DlgSetText(video, R_OPT_VIDEO_DEINTERLACE_THRESHOLD_CAPTION, GS(R_OPT_VIDEO_DEINTERLACE_THRESHOLD_CAPTION));
  1266.             
  1267.             // Audio
  1268.             DlgSetText(audio, R_OPT_AUDIO_AUDIOMODE_EXP, GS(OPT_AUDIO_AUDIOMODE_EXP));
  1269.             DlgSetText(audio, R_OPT_AUDIO_AUDIOMODE, GS(OPT_AUDIO_AUDIOMODE));
  1270.             DlgSetText(audio, R_OPT_AUDIO_DSC, GS(OPT_AUDIO_DSC));
  1271.             DlgSetText(audio, R_OPT_AUDIO_DOAUDIO, GS(OPT_AUDIO_DOAUDIO));
  1272.             DlgSetText(audio, R_OPT_AUDIO_NOAUDIO, GS(OPT_AUDIO_NOAUDIO));
  1273.             DlgSetText(audio, R_OPT_AUDIO_DSC_EXP, GS(OPT_AUDIO_DSC_EXP));
  1274.             DlgSetText(audio, R_OPT_AUDIO_DOAUDIO_EXP, GS(OPT_AUDIO_DOAUDIO_EXP));
  1275.             DlgSetText(audio, R_OPT_AUDIO_NOAUDIO_EXP, GS(OPT_AUDIO_NOAUDIO_EXP));
  1276.             DlgSetText(audio, R_OPT_AUDIO_SAMPLING_EXP, GS(OPT_AUDIO_SAMPLING_EXP));
  1277.             DlgSetText(audio, R_OPT_AUDIO_SAMPLING_TITLE, GS(OPT_AUDIO_SAMPLING_TITLE));
  1278.             DlgSetText(audio, R_OPT_AUDIO_SAMPLING_SAMEASINPUT, GS(OPT_AUDIO_SAMPLING_SAMEASINPUT));
  1279.             DlgSetText(audio, R_OPT_AUDIO_SAMPLING_SAMEASINPUT_EXP, GS(OPT_AUDIO_SAMPLING_SAMEASINPUT_EXP));
  1280.             // Post Processing
  1281.             DlgSetText(processing, R_OPT_PPOST_RESIZING_TITLE  , GS(R_OPT_PPOST_RESIZING_TITLE ));
  1282.             DlgSetText(processing, R_OPT_PPOST_RESIZING_NEAREST, GS(R_OPT_PPOST_RESIZING_NEAREST));
  1283.             DlgSetText(processing, R_OPT_PPOST_RESIZING_BILINEAR, GS(R_OPT_PPOST_RESIZING_BILINEAR));
  1284.             DlgSetText(processing, R_OPT_PPOST_RESIZING_BICUBIC, GS(R_OPT_PPOST_RESIZING_BICUBIC));
  1285.             DlgSetText(processing, R_OPT_PPOST_RESIZING_HQBICUBIC, GS(R_OPT_PPOST_RESIZING_HQBICUBIC));
  1286.             DlgSetText(processing, R_OPT_PPOST_RESIZING_NOTE, GS(R_OPT_PPOST_RESIZING_NOTE));
  1287.             DlgSetText(processing, R_OPT_PPOST_CROP_TITLE, GS(R_OPT_PPOST_CROP_TITLE));
  1288.             DlgSetText(processing, IDC_NOCROP  , GS(IDC_NOCROP ));
  1289.             DlgSetText(processing, IDC_NOLETTERBOX, GS(IDC_NOLETTERBOX));
  1290.             DlgSetText(processing, R_OPT_PPOST_CROP_TOPOFFSET, GS(R_OPT_PPOST_CROP_TOPOFFSET));
  1291.             DlgSetText(processing, R_OPT_PPOST_CROP_HEIGHT, GS(R_OPT_PPOST_CROP_HEIGHT));
  1292.             DlgSetText(processing, R_OPT_PPOST_CROP_LEFTOFFSET, GS(R_OPT_PPOST_CROP_LEFTOFFSET));
  1293.             DlgSetText(processing, R_OPT_PPOST_CROP_WIDTH, GS(R_OPT_PPOST_CROP_WIDTH));
  1294.             DlgSetText(processing, R_OPT_PPOST_CROP_TOP  , GS(R_OPT_PPOST_CROP_TOP ));
  1295.             DlgSetText(processing, R_OPT_PPOST_CROP_BOTTOM, GS(R_OPT_PPOST_CROP_BOTTOM));
  1296.             DlgSetText(processing, R_OPT_PPOST_CROP_LEFT, GS(R_OPT_PPOST_CROP_LEFT));
  1297.             DlgSetText(processing, R_FILES_AUDIOBOX_TITLE, GS(R_FILES_AUDIOBOX_TITLE));
  1298.             DlgSetText(processing, R_OPT_PPOST_CROP_RIGHT, GS(R_OPT_PPOST_CROP_RIGHT));
  1299.             DlgSetText(processing, R_OPT_PPOST_KEEPASPECT, GS(R_OPT_PPOST_KEEPASPECT));
  1300.             DlgSetText(processing, R_OPT_PPOST_KEEPASPECT_EXP, GS(R_OPT_PPOST_KEEPASPECT_EXP));
  1301.             DlgSetText(processing, R_OPT_PPOST_SHOWPAD_EXP, GS(R_OPT_PPOST_SHOWPAD_EXP));
  1302.             DlgSetText(processing, R_OPT_PPOST_CROP_SETTINGS_EXP, GS(R_OPT_PPOST_CROP_SETTINGS_EXP));
  1303.             DlgSetText(processing, R_OPT_PPOST_CROP_LETTERBOX_EXP, GS(R_OPT_PPOST_CROP_LETTERBOX_EXP));
  1304.             DlgSetText(processing, R_OPT_PPOST_KEEPASPECT, GS(R_OPT_PPOST_KEEPASPECT));
  1305.             DlgSetText(processing, IDC_SHOWPAD, GS(OPT_SHOWPAD));
  1306.             // Files
  1307.             DlgSetText(files, R_FILES_OUTFILES_TITLE  , GS(R_FILES_OUTFILES_TITLE ));
  1308.             DlgSetText(files, R_FILES_VIDEOBOX_TITLE, GS(R_FILES_VIDEOBOX_TITLE));
  1309.             DlgSetText(files, R_FILES_OUTVIDEO_SEX, GS(R_FILES_OUTVIDEO_SEX));
  1310.             DlgSetText(files, R_FILES_AUDIOBOX_TITLE, GS(R_FILES_AUDIOBOX_TITLE));
  1311.             DlgSetText(files, R_FILES_AUDIOBOX_EXP, GS(R_FILES_AUDIOBOX_EXP));
  1312.             DlgSetText(files, R_FILES_WARN, GS(R_FILES_WARN));
  1313.             DlgSetText(files, IDC_FILEBUTTON1, GS(1113));
  1314.             DlgSetText(files, IDC_FILEBUTTON2, GS(1113));
  1315.             // General
  1316.             DlgSetText(general, R_GENERAL_COMPTIME_TITLE  , GS(R_GENERAL_COMPTIME_TITLE ));
  1317.             DlgSetText(general, R_GENERAL_COMPTIME_SECONDSCOMPILE, GS(R_GENERAL_COMPTIME_SECONDSCOMPILE));
  1318.             DlgSetText(general, R_GENERAL_COMPTIME_FRAMESCOMPILE, GS(R_GENERAL_COMPTIME_FRAMESCOMPILE));
  1319.             DlgSetText(general, IDC_COMPILE_WHOLE  , GS(IDC_COMPILE_WHOLE ));
  1320.             DlgSetText(general, R_GENERAL_COMPTIME_COMPTIME_EXP1, GS(R_GENERAL_COMPTIME_COMPTIME_EXP1));
  1321.  
  1322.             // DlgSetText(general, R_GENERAL_COMPTIME_COMPTIME_EXP2, GS(R_GENERAL_COMPTIME_COMPTIME_EXP2));
  1323.             DlgSetText(general, R_GENERAL_SEARCHSIZE_TITLE, GS(R_GENERAL_SEARCHSIZE_TITLE));            
  1324.             DlgSetText(general, R_GENERAL_SEARCHSIZE_BOX, GS(R_GENERAL_SEARCHSIZE_BOX));
  1325.             DlgSetText(general, R_GENERAL_SEARCHSIZE_EXP, GS(R_GENERAL_SEARCHSIZE_EXP));
  1326.             DlgSetText(general, R_GENERAL_MISC_TITLEIDC_STATIC, GS(R_GENERAL_MISC_TITLEIDC_STATIC));
  1327.             DlgSetText(general, R_GENERAL_MISC_SHUTDOWN, GS(R_GENERAL_MISC_SHUTDOWN));            
  1328.  
  1329.  
  1330.             //Load from config
  1331.             //Audio output
  1332.             //If its not an AC3 disable DO_AUDIO
  1333. /*            if(!audio->isAC3){
  1334.                 DlgDisable(hDlg, IDC_DOAUDIO);
  1335.                 if(o.options.audioMode==DO_AUDIO) o.options.audioMode=DSC;
  1336.             }
  1337.             else{
  1338.                 DlgEnable(hDlg, IDC_DOAUDIO);
  1339.             }*/
  1340.  
  1341.  
  1342.             return TRUE;
  1343.         case WM_NOTIFY:
  1344.             switch(((LPNMHDR)lParam)->code){
  1345.                 case TCN_SELCHANGE:
  1346.                     /* is all data valid? */
  1347.                     if(pHdr->DlgTabCheck[o.options.selectedTab] &&
  1348.                         !pHdr->DlgTabCheck[o.options.selectedTab](pHdr->hwndDisplay)) {
  1349.                         /* there's a problem; set the focused tab back */
  1350.                         TabCtrl_SetCurSel(pHdr->hwndTab, o.options.selectedTab);
  1351.                         return FALSE;
  1352.                     }
  1353.  
  1354.                     /* we're OK */
  1355.                     OnSelChanged(hDlg);
  1356.  
  1357.                     break;
  1358.             }
  1359.             break;
  1360.         case WM_COMMAND:
  1361.             //Notifications
  1362.             switch(LOWORD(wParam))
  1363.             {
  1364.                 case IDOK:
  1365.                     /* is all data valid? */
  1366.                     if(pHdr->DlgTabCheck[o.options.selectedTab] &&
  1367.                         !pHdr->DlgTabCheck[o.options.selectedTab](pHdr->hwndDisplay)) {
  1368.                         /* there's a problem */
  1369.                         return FALSE;
  1370.                     }
  1371.  
  1372.                     //Video options
  1373.                     o.options.InterpolatedHeight=DlgGetText( video, IDC_HEIGHT);
  1374.                     o.options.InterpolatedWidth= DlgGetText( video, IDC_WIDTH);
  1375.                             //iDCT options
  1376.                     if(DlgIsChecked(video, R_OPT_IDCT_MMX))
  1377.                         o.options.idctType=IDCT_MMX;
  1378.                     else if (DlgIsChecked(video, R_OPT_IDCT_NONMMX))
  1379.                         o.options.idctType=IDCT_NORMAL;
  1380.                     else if (DlgIsChecked(video, R_OPT_IDCT_REF))
  1381.                         o.options.idctType=IDCT_IEEE;
  1382.  
  1383.  
  1384.  
  1385.                 DlgCheckBoxState( hDlg, R_OPT_VIDEO_DEINTERLACE_CHECK, o.options.deinterlace);
  1386.                 DlgCheckBoxState( hDlg, R_OPT_VIDEO_DEINTERLACE_BLEND, o.options.blend);
  1387.  
  1388.                     //Retrieve timebase
  1389.                     GetFrameRate( video, &o.options.timeBase );
  1390.                     // o.options.secondsToCompile = opt_run.opt.seconds;
  1391.                     o.options.framesToCompile  = opt_run.opt.frames_compile;
  1392.                     o.options.recons_progressive = DlgIsChecked(video, R_OPT_TIMEBASE_RECONS);
  1393.  
  1394.                     opt_run.pp.deinterlace   = DlgIsChecked(video, R_OPT_VIDEO_DEINTERLACE_CHECK);
  1395.                     opt_run.pp.blend_fields  = DlgIsChecked(video, R_OPT_VIDEO_DEINTERLACE_BLEND);
  1396.                     opt_run.pp.threshold     = DlgGetText(video, R_OPT_VIDEO_DEINTERLACE_THRESHOLD);
  1397.                     //Audio options
  1398.                     if(DlgIsChecked(audio, R_OPT_AUDIO_DSC))
  1399.                         o.options.audioMode=DSC;
  1400.                     else if(DlgIsChecked(audio, R_OPT_AUDIO_DOAUDIO)){
  1401.                         o.options.audioMode=DO_AUDIO;
  1402.                         if(DlgIsChecked(audio, IDC_48000)) o.options.outSampleFrequency=48000;
  1403.                         else o.options.outSampleFrequency=44100;
  1404.                         if(DlgIsChecked(audio, R_OPT_AUDIO_SAMPLING_SAMEASINPUT)) o.options.sampleFreqSameAsInput=true;
  1405.                         else o.options.sampleFreqSameAsInput=false;
  1406.                     }
  1407.                     else o.options.audioMode=NO_AUDIO;
  1408.  
  1409.                     //Processing
  1410.  
  1411.  
  1412.  
  1413.                 
  1414.                     //Files
  1415.                     DlgGetText( files, IDC_OUTPUT_FILE1, o.options.outputFile);    
  1416.                     DlgGetText( files, IDC_OUTPUT_FILE2, o.options.audioOutFile);
  1417.                     o.options.warn_overwrite = DlgIsChecked(files, R_FILES_WARN);
  1418.  
  1419.                     
  1420.                     //General
  1421.                     o.options.shutdown = DlgIsChecked(general, R_GENERAL_MISC_SHUTDOWN);
  1422.                     if(DlgIsChecked(general,IDC_COMPILE_WHOLE)){ //If we don't have the CompileWhole
  1423.                         o.options.framesToCompile = 300000;
  1424.                     }
  1425.                     else
  1426.                     {
  1427.                         o.options.framesToCompile =  opt_run.opt.frames_compile;
  1428.                     }
  1429.                     o.options.lurk_size = DlgGetText( general, IDC_LURKSIZE );
  1430.                     // Post Processing
  1431.                     SetPPostConfig(&o, &opt_run.pp);
  1432.  
  1433.                     DeleteObject(myFont);
  1434.                     EndDialog(hDlg, LOWORD(wParam));
  1435.                     return TRUE;
  1436.                 break;
  1437.                 case IDC_SHOWPAD:
  1438.                         DialogBox(hInst, MAKEINTRESOURCE(DLG_OUTPUT_PAD), hDlg, (DLGPROC)DlgPad);
  1439.  
  1440.                     break;
  1441.  
  1442.                 case IDCANCEL:
  1443.                     EndDialog(hDlg, LOWORD(wParam));
  1444.                     return TRUE;
  1445.                 break;
  1446.                 
  1447.             }
  1448.             break;
  1449.     }
  1450.     return FALSE;
  1451. }
  1452.  
  1453.  
  1454.